﻿#region SOURCE INFORMATION

//  COPYRIGHT LICENCE
//  
//   Copyright (c) 2011, D.E.M.O.N Organization
//   All rights reserved.
//  
//   Redistribution and use in source and binary forms, with or without modification,
//   are permitted provided that the following conditions are met:
//  
//       * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//       * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//       * Neither D.E.M.O.N Organization nor its contributors
//       may be used to endorse or promote products derived from this
//       software without specific prior written permission.
//  
//   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
//   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
//   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
//   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
//   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
//   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
//   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
//   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
//   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//  
//  
//  
//  CODE DESCRIPTION
//  
//         Created by Raistlin.K @ D.E.M.O.N at  10:09 PM  11/03/2012 .
//         E-Mail:                         DemonVK@Gmail.com
//  
//         Project Name:                   MySQLTweaker
//         Module  Name:                   Installer.cs
//         Part Of:                        MySQLTweaker
//         Last Change Date:              10:12 PM 05/04/2012

#endregion

#region

using System;
using System.IO;
using System.Management;
using System.Reflection;
using MySQLTweaker.INI;
using SevenZip;

#endregion

namespace MySQLTweaker
{
    public static class Installer
    {
        #region InstallType enum

        public enum InstallType
        {
            Full,
            Tiny
        }

        #endregion

        internal static string _MySQLVer = "5.5.22";

        /// <summary>
        ///   Get the MYSQL merge file Version.
        /// </summary>
        /// <returns> String : Version Number </returns>
        public static string GetMySQLVer()
        {
            return _MySQLVer;
        }

        public static void InstallMySQL(string iPath, InstallType iType, Action<bool> IsInstallComplete = null,
                                        Action<Exception> IsError = null)
        {
            try
            {
                if (iType == InstallType.Full)
                {
                    ExtractFile("MySQLTweaker.MySQL.FullSQL.share.part", iPath);
                    ExtractFile(
                        Distinguish64or32System() == "32"
                            ? "MySQLTweaker.MySQL.FullSQL.mysql32.part"
                            : "MySQLTweaker.MySQL.FullSQL.mysql64.part", iPath);
                }
                else
                {
                    ExtractFile("MySQLTweaker.MySQL.TinySQL.share.part", iPath);
                    ExtractFile(
                        Distinguish64or32System() == "32"
                            ? "MySQLTweaker.MySQL.TinySQL.mysql32.part"
                            : "MySQLTweaker.MySQL.TinySQL.mysql64.part", iPath);
                }

                Stream sm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MySQLTweaker.MySQL.my.ini");
                var sr = new StreamReader(sm);
                var sw = new StreamWriter(iPath + "\\bin\\my.ini");
                sw.Write(sr.ReadToEnd());
                sw.Flush();
                sw.Close();
                sr.Close();
                var iINIControl = new ClsIni(iPath + "\\bin\\my.ini");
                iINIControl.IniWriteValue("mysqld", "basedir", (iPath).Replace("\\", "/") + "/");
                iINIControl.IniWriteValue("mysqld", "datadir", (iPath).Replace("\\", "/") + "/data/");

                if (IsInstallComplete != null)
                {
                    IsInstallComplete(true);
                }
            }
            catch (Exception e)
            {
                if (IsError != null)
                {
                    IsError(e);
                }
            }
        }

        internal static void ExtractFile(string iStream, string iPath)
        {
            Stream sm = Assembly.GetExecutingAssembly().GetManifestResourceStream(iStream);

            var ext = new SevenZipExtractor(sm, "712726");

            for (int i = 0; i < ext.FilesCount; ++i)
            {
                ext.ExtractFiles(iPath, i);
            }

            if (sm != null) sm.Close();
        }

        internal static string Distinguish64or32System()
        {
            try
            {
                string addressWidth = String.Empty;
                var mConnOption = new ConnectionOptions();
                var mMs = new ManagementScope("\\\\localhost", mConnOption);
                var mQuery = new ObjectQuery("select AddressWidth from Win32_Processor");
                var mSearcher = new ManagementObjectSearcher(mMs, mQuery);
                ManagementObjectCollection mObjectCollection = mSearcher.Get();
                foreach (ManagementBaseObject mObject in mObjectCollection)
                {
                    addressWidth = mObject["AddressWidth"].ToString();
                }
                return addressWidth;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return "32";
            }
        }
    }
}